// 一、箭头函数：改变this指向
// （1）正常函数
function foo() {
    return function() {
        console.log(this.a);
    }
}
var obj1 = {
    a: 2
};
var obj2 = {
    a: 3
};
var bar = foo.call(obj1);
bar.call(obj2); // 3

// （2）箭头函数-----------------------------------------
/*foo() 内部的箭头函数会捕获调用时 foo() 的 this。
由于 foo() 的 this 绑定到 obj1，bar 引用箭头函数的 this 
也会绑定到 obj1，箭头函数的绑定无法修改。（new 也不行）
 */
function foo1() {
    return a => {
        // this继承自foo()
        console.log(this.a);
    }
}
var obj3 = {
    a: 2
};
var obj4 = {
    a: 3
};
var bar = foo1.call(obj3);
bar.call(obj4); // 2

// 箭头函数最常用于回调函数，例如事件处理器或者定时器：--------------------------------
function foo2() {
    setTimeout(() => {
        // this在词法上继承foo
        console.log(this.a);
    })
}
var obj5 = {
    a: 2
};
foo.call(obj5); // 2
/** 总结：箭头函数的作用:
 *  1. 类似于匿名函数，在某些情况下使用，可减少代码量
    2.代码简洁，this提前定义
    3.代码太过简洁，导致不好阅读
    4.this提前定义，导致无法使用js进行一些在ES5里面看起来非常正常的操作（若使用箭头函数，在监听点击事件的回调函数中，就无法获取到当前点击的元素咯，详见《正确使用箭头函数——什么时候不该用ES6箭头函数》）
    5.总的来说，箭头函数只是一种函数的简写，有其利弊，可用可不用
    6.使用箭头函数之后，不再需要以前hack的写法，var that = this。但不能盲目使用箭头函数
 */